package manong.mapper;

import manong.beans.CourseTable;
import manong.beans.CourseTableQuery;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.session.RowBounds;

import java.util.List;
@Mapper
public interface CourseTableMapper {

    long countByExample(CourseTableQuery example);
//根据传入的 CourseTableQuery 示例对象               % 来统计符合条件 %           的 "course_table" 表中的记录数量
   
    int deleteByExample(CourseTableQuery example);
//根据传入的 CourseTableQuery 示例对象来             % 删除符合条件 %              的 "course_table" 表中的记录，并返回删除的记录数作为一个整数 int。
    
    @Delete({
        "delete from course_table",
        "where id = #{id,jdbcType=INTEGER}"
    })
    int deleteByPrimaryKey(Integer id);
//根据传入的整数 id 删除 "course_table" 表中对应主键的记录，并返回删除的记录数作为一个整数 int。
    
    
    
    
    //基于 MyBatis 框架的注解方式进行数据库操作的一部分，它们通过 SQL 语句和参数映射来执行数据库操作。
    @Insert({
        "insert into course_table (arr_id, course_id, ",
        "class_id, room_id, ",
        "techer_id, seme_id, ",
        "seme_name, time_id, ",
        "time_name, course_name, ",
        "class_name, room_name, ",
        "techer_name, statu, ",
        "`temporary`, mark)",
        "values (#{arrId,jdbcType=INTEGER}, #{courseId,jdbcType=INTEGER}, ",
        "#{classId,jdbcType=INTEGER}, #{roomId,jdbcType=INTEGER}, ",
        "#{techerId,jdbcType=INTEGER}, #{semeId,jdbcType=INTEGER}, ",
        "#{semeName,jdbcType=VARCHAR}, #{timeId,jdbcType=INTEGER}, ",
        "#{timeName,jdbcType=VARCHAR}, #{courseName,jdbcType=VARCHAR}, ",
        "#{className,jdbcType=VARCHAR}, #{roomName,jdbcType=VARCHAR}, ",
        "#{techerName,jdbcType=VARCHAR}, #{statu,jdbcType=INTEGER}, ",
        "#{temporary,jdbcType=INTEGER}, #{mark,jdbcType=VARCHAR})"
    })
    //用于定义插入操作的注解。它会将一个新的记录插入到 "course_table" 表中。插入的 SQL 语句在这个注解中定义，它将 CourseTable 对象的字段映射到相应的数据库列上。
    
    
    
    
    @SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=Integer.class)
    //@SelectKey 注解也被用于获取最后插入的 ID，通常用于自增的主键。
    
    int insert(CourseTable record);
//用于将传入的 CourseTable 对象插入到 "course_table" 表中。它执行插入操作并返回一个整数，表示插入的记录数。
    
    int insertSelective(CourseTable record);
    //这个方法用于将一个 CourseTable 对象的非空字段插入到 "course_table" 表中，并返回插入的记录数作为一个整数 int

    List<CourseTable> selectByExampleWithRowbounds(CourseTableQuery example, RowBounds rowBounds);
    //用于根据传入的 CourseTableQuery 示例对象和 RowBounds 对象，从 "course_table" 表中选择一组记录。它还支持对结果进行分页或行数限制，这由 RowBounds 对象指定。
    //返回一个 CourseTable 对象的列表。
  
    CourseTable selectOneByExample(CourseTableQuery example);
//用于根据传入的 CourseTableQuery 示例对象从 "course_table" 表中选择一条记录，并将其封装为 CourseTable 对象。
  
    List<CourseTable> selectByExample(CourseTableQuery example);
//根据传入的整数 id 在 "course_table" 表中选择一条记录，并将其封装为 CourseTable 对象。这通常用于根据主键来获取记录。
    
    
    
   //数据库操作方法，用于执行对 course_table 表的增删改查操作，其中涉及到了条件查询、分页查询、按主键查询以及按条件更新等操作。
    //这些方法通常由业务逻辑层调用来实现对数据库的数据操作。
    @Select({
        "select",
        "id, arr_id, course_id, class_id, room_id, techer_id, seme_id, seme_name, time_id, ",
        "time_name, course_name, class_name, room_name, techer_name, statu, `temporary`, ",
        "mark",
        "from course_table",
        "where id = #{id,jdbcType=INTEGER}"
    })
    @ResultMap("manong.mapper.CourseTableMapper.BaseResultMap")
    CourseTable selectByPrimaryKey(Integer id);
//此方法根据主键 id 从 course_table 表中选择一条记录。
    int updateByExampleSelective(@Param("record") CourseTable record, @Param("example") CourseTableQuery example);
// 此方法根据提供的示例更新 course_table 中的记录。它会选择性地更新记录中非空字段。
   
    int updateByExample(@Param("record") CourseTable record, @Param("example") CourseTableQuery example);
//与上一个方法类似，但它会更新记录中的所有字段，而不考虑它们是否为空。
    int updateByPrimaryKeySelective(CourseTable record);
//此方法根据指定的主键更新 course_table 中的记录。它会选择性地更新记录中非空字段。
    @Update({
        "update course_table",
        "set arr_id = #{arrId,jdbcType=INTEGER},",
          "course_id = #{courseId,jdbcType=INTEGER},",
          "class_id = #{classId,jdbcType=INTEGER},",
          "room_id = #{roomId,jdbcType=INTEGER},",
          "techer_id = #{techerId,jdbcType=INTEGER},",
          "seme_id = #{semeId,jdbcType=INTEGER},",
          "seme_name = #{semeName,jdbcType=VARCHAR},",
          "time_id = #{timeId,jdbcType=INTEGER},",
          "time_name = #{timeName,jdbcType=VARCHAR},",
          "course_name = #{courseName,jdbcType=VARCHAR},",
          "class_name = #{className,jdbcType=VARCHAR},",
          "room_name = #{roomName,jdbcType=VARCHAR},",
          "techer_name = #{techerName,jdbcType=VARCHAR},",
          "statu = #{statu,jdbcType=INTEGER},",
          "`temporary` = #{temporary,jdbcType=INTEGER},",
          "mark = #{mark,jdbcType=VARCHAR}",
        "where id = #{id,jdbcType=INTEGER}"
    })
    int updateByPrimaryKey(CourseTable record);
    //这些方法提供了对 "course_table" 表进行常见数据库操作（如查询、更新、插入）的抽象化接口，以方便在应用程序中进行数据库交互。
  
    int insertOrUpdate(CourseTable record);
//向数据库表中插入或更新一条记录。
  //  如果表中已存在与 record 具有相同主键的记录，它会将 record 更新到数据库中。
    //如果表中没有与 record 具有相同主键的记录，它会将 record 插入到数据库中。
    //这个方法是一种 "插入或更新" 操作，通常用于确保一个记录存在，如果不存在则插入，如果存在则更新。
  
    int insertOrUpdateSelective(CourseTable record);
//类似于前一个方法，这个方法也用于插入或更新一条记录，但是它只会选择性地更新非空字段。
 
    int batchInsert(@Param("list") List<CourseTable> list);
//类似于前一个方法，但是这个方法还允许选择性地插入记录中的非空字段。
//    它接受一个 List，其中包含多个记录，并将它们一次性插入到数据库表中。

    int batchInsertSelective(@Param("list") List<CourseTable> list, @Param("selective") CourseTable.Column ... selective);
    //  可以通过 selective 参数指定要选择性插入的字段。这对于只想插入某些字段而不是所有字段的情况非常有用。
}

/*
提供了方便的方式来处理数据库记录的插入和更新操作，特别是在需要根据主键来执行插入或更新时。这些方法通常用于ORM（对象关系映射）框架，以便更容易地将对象与数据库表进行交互。
*/